Язык программирования R/Управляющие структуры
Условные операторы
[править]if()
[править]- Помощь при программировании:
> ?Control
Оператор if:
if (условие){ выполняется если условие верно } else { выполняется если условие не верно }
ifelse()
[править]Команда ifelse()
воспринимает первый аргумент как условие, второй аргумент возвращается если условие верно, а третий аргумент - если нет. Таким образом условие может быть вектором. Например, мы генерируем последовательность от 1 до 10 и хотим вывести значения меньше чем 5 и больше чем 8.
> x <- 1:10 > ifelse(x<5 | x>8, x, 0) [1] 1 2 3 4 0 0 0 0 9 10
Циклы
[править]R позволяет реализовать циклы тремя путями:
- циклы "for";
- циклы с предусловием ("while");
- "бесконечные" циклы ("repeat");
Циклы "for"
[править]Для использования оператора for
требуется указать индекс (в примере - k
) и вектор (в примере - 1:5
), а также указать выполняемую конструкцию и указать повторяемые операторы в фигурных скобках. Механизм работы следующий:
- интерпретатор последовательно выбирает значения из вектора и присваивает их переменной
k
; - с каждым значением
k
выполняется список функций в фигурных скобках.
> for (k in 1:5){ + print(k) + } [1] 1 [1] 2 [1] 3 [1] 4 [1] 5
Циклы с предусловием ("while")
[править]Синтаксис цикла while вполне стандартен:
- Ключевое слово
while
. - Условие выполнимости в скобках.
- Список функций для итерированного выполнения в фигурных скобках.
> g <- 0 > while (g < 1){ + g <- rnorm(1) + cat(g,"\n") + } -0.08111594 0.1732847 -0.2428368 0.3359238 -0.2080000 0.05458533 0.2627001 1.009195
"Бесконечные" циклы ("repeat")
[править]Нужно быть осторожным при использовании этого типа циклов, так как неправильное использование прерываний цикла (оператора break) может привести к бесконечному выполнению (зависанию) цикла. Синтаксис следующий:
- Ключевое слово
repeat
. - Список функций для итерированного выполнения в фигурных скобках.
- Наличие условия прерывания выполнения внутри цикла.
> repeat { + g <- rnorm(1) + if (g > 1.0) break + cat(g,"\n") + } -1.214395 0.6393124 0.05505484 -1.217408
Неявные циклы
[править]Циклы обычно медленны и лучше избегать их по возможности.
- Функция
apply()
может применить функцию к элементу матрицы или массиву. Чтобы применить к строке, нужно вторым параметром отдать цифру1
; чтобы применить к столбцу -2
.
> N <- 10 > x1 <- rnorm(N) > x2 <- rnorm(N) + x1 + 1 > male <- rbinom(N,1,.48) > y <- 1 + x1 + x2 + male + rnorm(N) > mydat <- data.frame(y,x1,x2,male) > apply(mydat,1,mean) # применяет функцию к каждой строке [1] 1.1654 2.8347 -0.9728 0.6512 -0.0696 3.9206 -0.2492 3.1060 2.0478 0.5116 > apply(mydat,2,mean) # применяет функцию к каждому столбцу y x1 x2 male 3.2468 0.1415 1.2900 0.5000
- Функция
lapply()
применяет функцию к каждому столбцу структуры и возвращает список.
> lapply(mydat,mean) # возвращает список $y [1] 3.247 $x1 [1] 0.1415 $x2 [1] 1.29 $male [1] 0.5
- Функция
sapply()
похожа, но не возвращает ничего на экран. Могут существовать векторы или матрицы зависящие от этой функции.
> sapply(mydat,mean) # возвращает вектор y x1 x2 male 3.2468 0.1415 1.2900 0.5000
- Функция
tapply()
применяет функцию к каждому уровню factor-а.
> tapply(mydat$y,mydat$male,mean) # применяет функцию к каждому уровню factor-а. 0 1 1.040 5.454
Итераторы
[править]Циклы в R обычно медленны. Итераторы могут быть более эффективны, чем циклы. Для более подробного изучения посетите Revolution Computing Blogs(англ.).
Функции
[править]Определение функции - это присвоение блока операторов переменной. Синтаксис:
- Переменная.
- Оператор присвоения.
- Ключевое слово
function
. - Список аргументов в круглых скобках.
fn=function(a) { + if (a) { + print("true"); + } else { + print("false"); + } + } > fn(TRUE) [1] "true" > fn(F) [1] "false"
Линковка C с R
[править]- Смотрите wikiversity Connecting Fortran and R(англ.).
- Link C with R(англ.).